package ServidorDistribuido;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.logging.Level;
import java.util.logging.Logger;

class HiloTimeUp implements Runnable{
    static boolean pararTemporizador = false;

    public static InetAddress calcularMaxIp(Hashtable <InetAddress, Boolean> tabla){
        Hashtable <Integer, InetAddress> numeroIp = new Hashtable <Integer, InetAddress> ();
        ArrayList <Integer> arr = new ArrayList();
        for (InetAddress ip : tabla.keySet()){
            int ipANumero =Integer.parseInt(ip.toString().split("[/]")[1].replace(".", ""));
            numeroIp.put(ipANumero, ip);
            arr.add(ipANumero);
        }
        Integer obj = Collections.max(arr);
        InetAddress mayorIp = numeroIp.get(obj);
        System.out.println("calcularMaxIp: La ip mas grande es: " + mayorIp);

        return mayorIp;
    }

    public void run() {
//        while(Servidor.matarHilos){
            System.out.println("\nHTU: Comenzo el Hilo Time Up.");
//            pararTemporizador = false;
            while(!pararTemporizador){
                System.out.println("################################################################");
                pararTemporizador = true;
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(HiloTimeUp.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            System.out.println("Time is up! Tiempo de elegir un nuevo coordinador");
            String nuevoCoordinador = calcularMaxIp(Servidor.estadoEjecucion).toString();
            System.out.println("nuevoCoordinador = " + nuevoCoordinador
                    + " Servidor.miIp = " + Servidor.miIp.toString()
                    + "tabla estadoEjecucion: " + Servidor.estadoEjecucion);
            if(nuevoCoordinador.equals(Servidor.miIp.toString())){
    //            System.out.println("ENTRE AL IF NUEVO COORDINADOR EQUALS MI IP");
                for (int i = 0; i < 10; i++) {
                    try {
                        DatagramPacket dp = new DatagramPacket(nuevoCoordinador.getBytes(), nuevoCoordinador.length(), Servidor.group, Servidor.MULTICASTSERVERPORT);
                        Servidor.msock.send(dp);
                        Thread.sleep(100);
                    }catch (Exception ex) {
                        Logger.getLogger(HiloTimeUp.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
    //            try {
    //                System.out.println("Cerrando msock y socketCliente en Servidor.");
    //                Servidor.msock.close();// Mata los hilos HiloMulticast*. El de escritura estara muerto si no esCoordinador
    //                Servidor.socketCliente.close();
    //            } catch (Exception ex) {
    //                System.out.println("\nHiloTimeUp: Error cerrando los sockets. " + ex.toString());
    //                Logger.getLogger(HiloTimeUp.class.getName()).log(Level.SEVERE, null, ex);
    //            }
            }//end if
//        }// end while Servidor.matarHilos
    }
}
